package com.may.provider.bootstrap.controller;

import cn.hutool.core.lang.Console;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.api.R;
import com.may.db.provider.entity.User;
import com.may.db.provider.service.IUserService;
import com.may.provider.api.ProviderHelloServiceApi;
import com.may.resttemplate.utils.RequestUtil;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import javax.annotation.PostConstruct;
import javax.annotation.Resource;
import java.util.HashMap;
import java.util.Map;

@RestController
@RequestMapping("/p")
public class ProviderHelloController {

    /**
     * 特别注意：
     * 在因为服务在本地，所以 pom 中依赖的是接口的实现。
     * 如果是其他服务依赖本服务，pom 中应该依赖接口，不要依赖接口的实现，虽然那样也能跑，但是没有去走其他服务。
     *
     * 如果依赖引入没有问题，可能会出现 no provider xxx 的异常，这表示订阅的服务没有启动或者网络抖动没用访问到；
     * 如果是依赖错了，会报 failed invoke method xxx 的异常，这就是应该引入实现类而不是接口
     */
    @Resource//也可以用 @DubboReference，走dubbo。不过这里是本地服务，用本地注入即可
    private ProviderHelloServiceApi helloService;
    @Autowired
    private RequestUtil requestUtil;
    @Autowired
    private IUserService userService;
    @Autowired
    private Environment env;

    @PostConstruct
    public void init(){
        requestUtil.setBase("http://localhost:8081");
    }

    @GetMapping
    public String hello(){
        return helloService.hello("Bobby Ma");
    }

    @GetMapping("/rest")
    public String rest(){
        ResponseEntity<String> responseEntity = requestUtil.get("/c",String.class);
        Console.log(responseEntity.getBody());
        return responseEntity.getBody();
    }

    /**
        * @Description: http://localhost:8080/p/user/1
        * @param id
        * @return: com.baomidou.mybatisplus.extension.api.R
        * @Author: Bobby.Ma
        * @Date: 2020/7/4 15:48
    */
    @GetMapping("/user/{id}")
    public R getUser(@PathVariable Integer id){
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        wrapper.lambda().eq(true,User::getId, id);//等价写法 wrapper.eq(false,"id",id); 。前面的 boolean 参数表示要不要拼上这个条件，默认true
        return R.ok(userService.getOne(wrapper));
    }

    /**
        * @Description: http://localhost:8080/p/user/map/2?uname=
        * @param id
        * @param uname
        * @return: com.baomidou.mybatisplus.extension.api.R
        * @Author: Bobby.Ma
        * @Date: 2020/7/4 15:48
    */
    @GetMapping("/user/map/{id}")
    public R getUserByMap(@PathVariable Integer id,@RequestParam String uname){
        QueryWrapper<User> wrapper = new QueryWrapper<>();
        Map<String, Object> map = new HashMap<>();
        map.put("id",id);
        map.put("age",17);
        map.put("uname","".equals(uname) ? null : uname);
//        wrapper.allEq(true,map,true);//前面的boolean参数同上，表示要不要拼上这个条件，后面这个boolean参数为true，则如果map中有value为null时，将变成 column is null，为false则忽略参数为null的这个条件，默认false
        wrapper.allEq((k,v) -> StringUtils.contains(k,"a"),map,true);//传一个断言函数，符合条件的参数才会被拼接
        return R.ok(userService.list(wrapper));
    }

    @GetMapping("/env")
    public String env(){
        System.out.println(env.getProperty("name"));
        System.out.println(env.getProperty("public"));
        return "sss";
    }
}
